package controllers;

import play.*;
import play.mvc.*;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;

import org.h2.command.dml.ExecuteProcedure;

import models.*;

public class Application extends Controller {

	public static List<Material> lista = new ArrayList<Material>();
	public static List<Material> listaevento = new ArrayList<Material>();
	public static Servico serv = new Servico();
	public static List<Cliente> clientes = new ArrayList<Cliente>(); 
	public static boolean lock = false;
	public static Usuary user = new Usuary();

	public static String removeWhitespaces(String s) {

		if (!s.equals("")) {
			int i, f;
			i = 0;
			f = s.length() - 1;
			while ((s.charAt(i) == ' ') && (i < s.length())) {
				i++;
			}
			while ((s.charAt(f) == ' ') && (f > i)) {
				f--;
			}
			String res;
			if (i <= f) {
				res = s.substring(i, f);
			} else {
				res = "";
			}

			return res;
		} else {
			return "";
		}
	}

	public static int dia(String data) {
		if (!data.equals("")) {
			if (data.length() == 10) {
				String day = data.substring(8, 10);
				return Integer.parseInt(day);

			}
			else {
				return -1;
			}
		}
		else {
			return -1;
		}
	}

	public static int mes(String data) {
		if (!data.equals("")) {
			if (data.length() == 10) {
				String month = data.substring(5, 7);
				return Integer.parseInt(month);
			}
			else {
				return -1;
			}
		}
		else {
			return -1;
		}
	}

	public static int ano(String data) {
		if (!data.equals("")) {
			if (data.length() == 10) {
				String year = data.substring(0, 4);
				return Integer.parseInt(year);
			}
			else {
				return -1;
			}
		}
		else {
			return -1;
		}
	}

	public static int compare(String data1, String data2) {
		int qdias = 0;
		int[] meses = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
		if (data1.equals(data2)) {
			qdias = 0;
		}
		else {
			int dia1, mes1, ano1, dia2, mes2, ano2;

			ano1 = ano(data1);
			ano2 = ano(data2);

			mes1 = mes(data1);
			mes2 = mes(data2);

			dia1 = dia(data1);
			dia2 = dia(data2);

			qdias = (ano1-ano2)*365 + (mes1-mes2)*30 + dia1-dia2;

			if (mes1 > mes2) {
				for (int i = mes2-1; i < mes1-1; i++) {
					qdias += meses[i] - 30;
				}
			}
			else if (mes1 < mes2) {
				for (int i = mes1-1; i < mes2-1; i++) {
					qdias -= meses[i] - 30;
				}
			}

		}
		return qdias;
	}

	public static Usuary verify(int Uid) throws SQLException {
		conectar();
		ResultSet t;
		t = comando.executeQuery("SELECT * FROM usuario WHERE id_u="+Uid+"");
		Usuary u = new Usuary();
		if (t.next()){
			u = new Usuary(t.getInt("id_u"), t.getString("nome"), t.getString("tipo"));
		}
		if ((user.getNome().equals(u.getNome())&&(user.getID()==Uid))||(Uid == 0)) {
			String Unome, Utipo;
			if (Uid == 0) {
				Unome = "Admin";
				Utipo = "administrador";
			}
			else {
				Unome = t.getString("nome");
				Utipo = t.getString("tipo");
			}
			t.close();
			desconectar();
			Usuary p = new Usuary(Uid, Unome, Utipo);
			return p;
		}
		else {
			t.close();
			desconectar();
			Usuary p = new Usuary(-1, "**", "**");
			return p;
		}

	}

	public static void index() {
		listaevento = new ArrayList<Material>();
		serv = new Servico();
		clientes = new ArrayList<Cliente>();
		lock = false;
		user = new Usuary();
		render();
	}

	public static void admin(int Uid) throws SQLException {

		listaevento = new ArrayList<Material>();
		serv = new Servico();
		clientes = new ArrayList<Cliente>();
		lock = false;
		Usuary u = verify(Uid);
		if (u.getID() != -1){
			String Unome, Utipo;
			Unome = u.getNome();
			Utipo = u.getTipo();
			render(Uid, Unome, Utipo);
		} else {
			flash.error("Para conectar, ofereça login e senha.");
			index();
		}
	}

	public static void cadastro() throws SQLException {
		listaevento = new ArrayList<Material>();
		serv = new Servico();
		clientes = new ArrayList<Cliente>();
		lock = false;
		Usuary u = user;
		if (u.getID() != -1) {
			int Uid;
			String Unome, Utipo;
			Uid = u.getID();
			Unome = u.getNome();
			Utipo = u.getTipo();
			render(Uid, Unome, Utipo);
		}
		else {
			flash.error("Para conectar, ofereça login e senha.");
			index();
		}
	}

	public static void busca() {
		listaevento = new ArrayList<Material>();
		serv = new Servico();
		clientes = new ArrayList<Cliente>();
		lock = false;
		Usuary u = user;
		if (u.getID() != -1) {
			int Uid;
			String Unome, Utipo;
			Uid = u.getID();
			Unome = u.getNome();
			Utipo = u.getTipo();
			render(Uid, Unome, Utipo);
		}
		else {
			flash.error("Para conectar, ofereça login e senha.");
			index();
		}
	}

	public static void estoque() throws SQLException {
		listaevento = new ArrayList<Material>();
		serv = new Servico();
		clientes = new ArrayList<Cliente>();
		lock = false;
		Usuary u = user;
		if (u.getID() != -1) {
			List<Material> lis = new ArrayList<Material>();
			lis = lista;
			lista = new ArrayList<Material>();

			if (!lis.isEmpty()) {
				conectar();
				ResultSet r;
				for (int i = 0; i < lis.size(); i++) {
					r = comando.executeQuery("SELECT qtd FROM servicoxmaterial WHERE id_m="+lis.get(i).getId()+"");
					lis.get(i).setUsed(0);
					while (r.next()) {
						lis.get(i).setUsed(lis.get(i).getUsed() + r.getInt("qtd"));
					}
					r.close();
				}
				desconectar();
			}
			int Uid;
			String Unome, Utipo;
			Uid = u.getID();
			Unome = u.getNome();
			Utipo = u.getTipo();

			render(lis, Uid, Unome, Utipo);
		}
		else {
			flash.error("Para conectar, ofereça login e senha.");
			index();
		}
	}

	public static void servico() throws SQLException {
		Usuary u = user;
		if (u.getID() != -1) {
			int Uid;
			String Unome, Utipo;
			Uid = u.getID();
			Unome = u.getNome();
			Utipo = u.getTipo();
			List<Material> listaMT = new ArrayList<Material>();
			List<Cliente> listaC = new ArrayList<Cliente>();
			List<Material> listaMU = new ArrayList<Material>();


			if (lock == false)//quando carrega a página pela primeira vez
			{

				conectar();
				ResultSet res;
				res = comando.executeQuery("SELECT * FROM material WHERE quantidade<>-1");
				while (res.next())
				{
					Material x = new Material(res.getInt("id_m"),res.getString("nome"),res.getInt("quantidade"),res.getString("tipo"),res.getString("tags"));
					listaevento.add(x);
					listaMT.add(x);

				}
				res.close();

				//adicionar qtd alugado aos materiais
				res = comando.executeQuery("SELECT * FROM cliente");
				while (res.next())
				{
					Cliente y = new Cliente(res.getInt("id_c"),res.getString("nome"),res.getString("endereco"),res.getString("rg"),res.getString("email"),res.getString("tel"),res.getString("cel"));
					clientes.add(y);
					listaC.add(y);
				}

				Cliente j = new Cliente(0,"------","","","","","");
				clientes.add(0,j);
				listaC.add(0,j);

				lock = true;
				res.close();
				desconectar();

			}
			listaMT = listaevento;
			listaC = clientes;
			listaMU = serv.getMats();
			String localE = serv.getLocalizacao();
			String obsE = serv.getObs();
			String diE = serv.getData_inicio();
			String dfE = serv.getData_final();
			int qtdE = serv.getQtd();
			render(Uid, Unome, Utipo, listaMT, listaC, listaMU, localE, obsE, diE, dfE, qtdE);
		}
		else {
			flash.error("Para conectar, ofereça login e senha.");
			index();
		}
	}

	public static void atualizaServico(String botao, String dataI, String dataF, String local, String obs, int cliente, int material, int qt, int idlmu, double valor) throws SQLException
	{
		if (botao.equals("add"))
		{
			if ((!dataI.equals(""))&&(!dataF.equals("")))
			{
				serv.setData_inicio(dataI);
				serv.setData_final(dataF);
				serv.setLocalizacao(local);
				serv.setObs(obs);

				conectar();
				ResultSet res;
				res = comando.executeQuery("SELECT * FROM cliente WHERE id_c ="+cliente);

				while (res.next())
				{
					//colocar o cliente no topo da lista
					Cliente c = new Cliente(res.getInt("id_c"), res.getString("nome"), res.getString("endereco"), res.getString("rg"), res.getString("email"), res.getString("tel"),res.getString("cel"));
					clientes.remove(c);
					clientes.add(0,c);
				}
				res.close();
				int qtdwtfh=0;
				res = comando.executeQuery("SELECT quantidade FROM material WHERE id_m="+material);
				while (res.next())
				{
					qtdwtfh = res.getInt("quantidade");
				}
				res.close();
				System.out.println("qtdwtfh="+qtdwtfh);
				res = comando.executeQuery("SELECT servico.id_s, servico.dia_inicio, servico.dia_entrega, servicoxmaterial.qtd, servicoxmaterial.id_m FROM servico INNER JOIN servicoxmaterial ON servico.id_s=servicoxmaterial.id_s WHERE servicoxmaterial.id_m ="+material);
				while (res.next())
				{
					/*
				//checar disponibilidade
				String data_i = res.getString("dia_inicio");
				int wtf = compare(data_i, dataI);
				data_i = res.getString("dia_entrega");
				int wth = compare(data_i, dataI);
				data_i = res.getString("dia_inicio");
				int wtfh = compare(data_i,dataF);
				if (((wtf <=0)&&(wth>=0)))
				{
					qtdwtfh -= res.getInt("qtd");
				}
					 */
					String databancoinicio = res.getString("dia_inicio");
					String databancofim = res.getString("dia_entrega");
					int Ci1_i2 = compare(databancoinicio,dataI);
					int Cf1_i2 = compare(databancofim,dataI);
					int Ci1_f2 = compare(databancoinicio,dataF);
					if (((Ci1_i2<=0)&&(Cf1_i2>=0))||((Ci1_i2>=0)&&(Ci1_f2<=0)))
					{
						qtdwtfh -= res.getInt("qtd");
					}

				}
				res.close();
				System.out.println("qtdwtfh depois de deduzido="+qtdwtfh);

				if (qtdwtfh>=qt)
				{
					if (qt > 0)
					{
						res = comando.executeQuery("SELECT * FROM material WHERE id_m = "+material);

						while (res.next())
						{
							//remover material dos adicionáveis
							Material x = new Material(res.getInt("id_m"),res.getString("nome"),qt,res.getString("tipo"),res.getString("tags"));
							for (int i = 0; i < listaevento.size(); i++) {
								if (listaevento.get(i).getId() == x.getId()) {
									listaevento.remove(i);
									break;
								}
							}
							//adicionar material aos adicionados
							serv.addMat(x);
						}
					}
					else
					{
						flash.error("quantidade deve ser um valor maior que zero!");
					}
					res.close();

				}

				else
				{
					flash.error("Nao ha materiais o suficiente para a data requisitada");
				}
				desconectar();
				servico();

			}
			else if (botao.equals("remover"))
			{

				serv.setData_inicio(dataI);
				serv.setData_final(dataF);
				serv.setLocalizacao(local);
				serv.setObs(obs);
				serv.setQtd(qt);
				conectar();
				ResultSet res;
				res = comando.executeQuery("SELECT * FROM cliente WHERE id_c ="+cliente);

				while (res.next())
				{
					//colocar o cliente no topo da lista
					Cliente c = new Cliente(res.getInt("id_c"), res.getString("nome"), res.getString("endereco"), res.getString("rg"), res.getString("email"), res.getString("tel"),res.getString("cel"));
					clientes.remove(c);
					clientes.add(0,c);
				}
				res.close();
				res = comando.executeQuery("SELECT * FROM material WHERE id_m = "+idlmu);

				while (res.next())
				{
					//remover material dos adicionados
					Material x = new Material(res.getInt("id_m"),res.getString("nome"),res.getInt("quantidade"),res.getString("tipo"),res.getString("tags"));
					serv.remMat(x);
					//adicionar material aos adicionáveis
					listaevento.add(x);
				}
				desconectar();
				servico();
			}
			else
			{
				flash.error("datas não podem ser vazias!");
				servico();
			}
		}
		else if (botao.equals("cadastrar"))
		{
			if ((!dataI.equals(""))&&(!dataF.equals("")))
			{
				if ((!local.equals(""))&&(valor >= 0)&&(cliente != 0)&&(!serv.getMats().isEmpty())) {
					serv.setData_inicio(dataI);
					serv.setData_final(dataF);
					serv.setLocalizacao(local);
					serv.setObs(obs);
					serv.setPreco(valor);

					conectar();
					comando.executeUpdate("INSERT INTO servico (id_c, dia_inicio, dia_entrega, localizacao, descricao, valor) VALUES ("+cliente+",'"+serv.getData_inicio()+"','"+serv.getData_final()+"','"+serv.getLocalizacao()+"','"+serv.getObs()+"',"+serv.getPreco()+")");
					ResultSet r;

					int id_servico = 0;
					r = comando.executeQuery("SELECT id_s FROM servico");
					r.last();
					id_servico = r.getInt("id_s");
					r.close();

					List<Material> listing = serv.getMats();
					for (int i = 0; i < listing.size(); i++) {
						comando.executeUpdate("INSERT INTO servicoxmaterial VALUES ("+id_servico+", "+listing.get(i).getId()+", "+listing.get(i).getQtd()+")");
					}
					desconectar();
					listaevento = new ArrayList<Material>();
					serv = new Servico();
					clientes = new ArrayList<Cliente>();
					lock = false;
					servico();
				}
				else if (local.equals("")) {
					flash.error("Localizacao precisa ser informada");
					servico();
				}
				else if (cliente == 0) {
					flash.error("Selecione um cliente");
					servico();
				}
				else if (serv.getMats().isEmpty()) {
					flash.error("Lista dos materiais nao foi informada");
					servico();
				}
				else {
					flash.error("Preco invalido. Informe um preco corretamente.");
					servico();
				}
			}
			else
			{
				flash.error("quantidade deve ser um valor maior que zero!");
			}
		}
		else
		{
			listaevento = new ArrayList<Material>();
			serv = new Servico();
			clientes = new ArrayList<Cliente>();
			lock = false;
			servico();

		}
	}

	public static void agenda() {
		listaevento = new ArrayList<Material>();
		serv = new Servico();
		clientes = new ArrayList<Cliente>();
		lock = false;
		render();
	}

	public static void gerenciar() {
		listaevento = new ArrayList<Material>();
		serv = new Servico();
		clientes = new ArrayList<Cliente>();
		lock = false;
		Usuary u = user;
		if (u.getID() != -1) {
			int Uid;
			String Unome, Utipo;
			Uid = u.getID();
			Unome = u.getNome();
			Utipo = u.getTipo();
			render(Uid, Unome, Utipo);
		}
		else {
			flash.error("Para conectar, ofereça login e senha.");
			index();
		}
	}

	public static void evento() throws SQLException
	{
		Usuary u = user;
		if (u.getID() != -1) {
			int Uid;
			String Unome, Utipo;
			Uid = u.getID();
			Unome = u.getNome();
			Utipo = u.getTipo();
			render(Uid, Unome, Utipo);
		}
		else {
			flash.error("Para conectar, ofereça login e senha.");
			index();
		}
	}

	public static void somar(int add, int id) throws SQLException {

		conectar();

		comando.executeUpdate("UPDATE material SET quantidade=quantidade + "
				+ add + " WHERE id_m=" + id + "");

		estoque();

	}

	public static void remover(int rem, int id) throws SQLException {

		conectar();

		ResultSet r;

		r = comando.executeQuery("SELECT) quantidade FROM material WHERE id_m="
				+ id + "");
		if (r.getInt("quantidade") > rem) {
			comando.executeUpdate("UPDATE material SET quantidade=quantidade - "
					+ rem + " WHERE id_m=" + id + "");
		} else {
			comando.executeUpdate("UPDATE material SET quantidade=0 WHERE id_m="
					+ id + "");
		}
		estoque();

	}

	public static void excluirMaterial(int id) throws SQLException {
		/*
		 * A exclusão de material permite apenas excluir os materiais que
		 * puderem ser excluidos. Como a tabela para a verificação da agenda
		 * precisa saber quais materiais foram usados, mesmo se esses tiverem
		 * sido excluidos, convenciona-se marcar o campo 'quantidade' desses
		 * materiais como -1 e não exclui-los, assim apenas os materiais que não
		 * estão sendo referenciados por algum serviço é que serão realmente
		 * retirados da tabela de materiais no Banco de Dados
		 */
		conectar();

		ResultSet r;

		r = comando.executeQuery("SELECT * FROM servicoXmaterial WHERE id_m="
				+ id + "");// tabela dos sevocos que referenciam o material

		if (!r.next()) {
			comando.executeUpdate("DELETE FROM material WHERE id_m=" + id + "");// se
			// tabela
			// vazia,
			// pode
			// retirar
			// material
			// da
			// tabela
		} else {
			comando.executeUpdate("UPDATE material SET quantidade=-1 WHERE id_m="
					+ id + "");// senão, apenas marca com -1
		}

		estoque();
	}

	public static void telaSucesso() throws SQLException {// apenas para testes

		listaevento = new ArrayList<Material>();
		serv = new Servico();
		clientes = new ArrayList<Cliente>();
		lock = false;
		List<Usuary> usuarios = new ArrayList<Usuary>();

		conectar();
		ResultSet r;

		r = comando.executeQuery("SELECT id_u, nome, tipo FROM usuario");
		while (r.next()) {
			Usuary u = new Usuary(r.getInt("id_u"), r.getString("nome"),
					r.getString("tipo"));
			usuarios.add(u);
		}

		render(usuarios);
	}

	public static void redefinirSenha() throws SQLException {

		listaevento = new ArrayList<Material>();
		serv = new Servico();
		clientes = new ArrayList<Cliente>();
		lock = false;
		Usuary u = user;
		if (u.getID() != -1) {
			int Uid;
			String Unome, Utipo;
			Uid = u.getID();
			Unome = u.getNome();
			Utipo = u.getTipo();
			render(Uid, Unome, Utipo);
		}
		else {
			flash.error("Para conectar, ofereça login e senha.");
			index();
		}
	}

	private static Connection con;
	private static Statement comando;

	private static void conectar() throws SQLException {

		try {
			Class.forName("org.postgresql.Driver");
		} catch (ClassNotFoundException e) {
		}

		con = DriverManager.getConnection(
				"jdbc:postgresql://localhost:5432/gof", "postgres", "g32iko3j");

		comando = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);


	}

	private static void desconectar() throws SQLException {

		comando.close();
		con.close();
	}

	public static void cadastrarUsuario(String nome, String login,
			String senha, String tipo) throws SQLException {

		conectar();
		comando.executeUpdate("INSERT INTO usuario (nome, login, senha, tipo) VALUES ( '"
				+ nome + "','" + login + "','" + senha + "','" + tipo + "' )");

		desconectar();

		index();
	}

	public static void cadastroCliente(String nome, String endereco, String rg,
			String email, String tel, String cel) throws SQLException {

		String fone, celular, ident, e_mail;

		// para o cadastro de cliente ser valido, os campos nome, endereco não
		// podem ser nulos e tel ou cel deve ser informado
		if ((!nome.equals("")) && (!tel.equals("") || !cel.equals(""))
				&& (!endereco.equals(""))) {

			// os campos abaixos são os que não são obrigatórios, se eles não
			// forem informados, coloca-se um "***" no campo
			if (rg.equals("")) {
				ident = "***";
			} else {
				ident = rg;
			}

			if (email.equals("")) {
				e_mail = "***";
			} else {
				e_mail = email;
			}

			// já que ou tel ou cel foram informados, se um não foi passado, o
			// outro foi, ou então ambos foram
			if (tel.equals("")) {
				fone = "***";
				celular = cel;
			} else if (cel.equals("")) {
				fone = tel;
				celular = "***";
			} else {
				fone = tel;
				celular = cel;
			}

			conectar();

			String cmd = "'" + nome + "','" + endereco + "','" + ident + "','"
					+ e_mail + "','" + fone + "','" + celular + "'";

			comando.executeUpdate("INSERT INTO cliente (nome, endereco, rg, email, tel, cel) VALUES ( "
					+ cmd + " )");

			desconectar();

			flash.error("Cadastro de cliente efetuado");
			cadastro();
		} else {
			flash.error("campos obrigatorios nao foram preenchidos");
			cadastro();
		}

	}

	public static void buscaCliente() {

	}

	public static void cadastroMaterial(String nome, String tipo, String tags)
			throws SQLException {
		conectar();
		ResultSet r;
		String name, type, t;
		name = nome.toLowerCase();
		type = tipo.toLowerCase();
		t = tags.toLowerCase();

		r = comando
				.executeQuery("SELECT nome, quantidade, tipo FROM material WHERE nome='"
						+ name
						+ "' AND quantidade <> -1 AND tipo='"
						+ type
						+ "'");

		if (!(r.next())) {
			comando.executeUpdate("INSERT INTO material (nome, quantidade, tipo, tags) VALUES ( '"
					+ name + "', 0, '" + type + "', '" + t + "' )");
			r.close();
			desconectar();
			estoque();
		} else {
			r.close();
			desconectar();
			flash.error("Material ja existente no estoque");
			estoque();
		}

	}

	public static void buscaMaterial(String nome, String tipo, String tags)
			throws SQLException {

		nome = nome.toLowerCase();
		tipo = tipo.toLowerCase();
		tags = tags.toLowerCase();

		if (tags.equals("")) {

			conectar();
			ResultSet r;



			if ((nome.equals("")) && (tipo.equals(""))) {
				r = comando.executeQuery("SELECT * FROM material");

			} else if ((nome.equals("")) && (!tipo.equals(""))) {
				r = comando.executeQuery("SELECT * FROM material WHERE tipo='"+ tipo + "'");
			} else if (!(nome.equals("")) && (tipo.equals(""))) {
				r = comando.executeQuery("SELECT * FROM material WHERE nome='"+ nome + "'");
			} else {
				r = comando.executeQuery("SELECT * FROM material WHERE nome='"+ nome + "' AND tipo='" + tipo + "'");
			}

			while (r.next()) {
				Material m = new Material(r.getInt("id_m"),
						r.getString("nome"), r.getInt("quantidade"),
						r.getString("tipo"), r.getString("tags"));



				if (m.getQtd() != -1) {
					m.setUsed(2);
					lista.add(m);
				}

			}

			r.close();
			desconectar();
			estoque();

		} else {

			conectar();
			ResultSet r;

			String hadouken;
			Boyer_Moore ex;

			// trecho para obter listas das tags do campo tag
			List<String> taglist = new ArrayList<String>();
			int i = 1;
			int ini, fin;
			ini = 0;
			while (i < tags.length()) {
				if (tags.charAt(i) == ',') {
					fin = i;

					hadouken = tags.substring(ini, fin - 1);
					hadouken = removeWhitespaces(hadouken);

					if (!hadouken.equals("")) {
						taglist.add(hadouken);
					}
					ini = fin + 1;

				}
				i++;
			}
			hadouken = tags.substring(ini, tags.length() - 1);
			hadouken = removeWhitespaces(hadouken);

			if (!hadouken.equals("")) {
				taglist.add(hadouken);
			}
			// fim desse trecho

			if ((nome.equals("")) && (tipo.equals(""))) {
				r = comando.executeQuery("SELECT * FROM material");
			} else if ((nome.equals("")) && (!tipo.equals(""))) {
				r = comando.executeQuery("SELECT * FROM material WHERE tipo='"+ tipo + "'");
			} else if (!(nome.equals("")) && (tipo.equals(""))) {
				r = comando.executeQuery("SELECT * FROM material WHERE nome='"+ nome + "'");
			} else {
				r = comando.executeQuery("SELECT * FROM material WHERE nome='"+ nome + "' AND tipo='" + tipo + "'");
			}

			while (!r.isClosed()) {
				if (r.next()) {
					int x = -1;
					int n = 0;
					while ((n < taglist.size())&&(x == -1)) {

						String str = taglist.get(n);
						if (r.getString("tags").length() > str.length()) {
							ex = new Boyer_Moore(r.getString("tags"), str);
							x = ex.Boyer_M2_Match();
						}
						n++;
					}
					if (x != -1) {
						Material m = new Material(r.getInt("id_m"),
								r.getString("nome"), r.getInt("quantidade"),
								r.getString("tipo"), r.getString("tags"));
						if (m.getQtd() != -1) {
							lista.add(m);
						}
					}
				}
				else {
					break;
				}

			}
			r.close();
			desconectar();
			estoque();

		}



	}

	public static void fazerLogin(String login, String senha)
			throws SQLException {

		conectar();


		ResultSet rs;

		rs = comando.executeQuery("SELECT * FROM usuario WHERE login='" + login
				+ "' AND senha='" + senha + "'");

		if ((rs.next()) || (login.equals("admin") && (senha.equals("abc123")))) {
			Usuary u = new Usuary();
			if ((!login.equals("admin") || (!senha.equals("abc123")))) {
				u = new Usuary(rs.getInt("id_u"), rs.getString("nome"), rs.getString("tipo"));
			}
			else{
				u = new Usuary(0, "Admin", "administrador");
			}
			user = u;
			rs.close();
			desconectar();
			admin(u.getID());

		} else {

			flash.error("Login ou senha incorretos, tente novamente!");
			rs.close();
			desconectar();
			index();

		}
	}

	public static void alterarSenha(String sAtual, String sNova) throws SQLException {
		if (sAtual.equals("")) {
			flash.error("Senha atual precisa ser informada");
			redefinirSenha();
		}
		else if (sNova.equals("")) {
			flash.error("A nova senha precisa ser informada");
			redefinirSenha();
		}
		else {
			conectar();
			ResultSet r;

			r = comando.executeQuery("SELECT * FROM usuario WHERE id_u="+user.getID()+"");
			if (r.next()) {
				if (r.getString("senha").equals(sAtual)) {
					comando.executeUpdate("UPDATE usuario SET senha='"+sNova+"' WHERE senha='"+sAtual+"'");
					flash.error("Senha alterada com sucesso");
					admin(user.getID());
				}
				else {
					flash.error("Senha atual nao esta correta");
					redefinirSenha();
				}
			}
			else if (user.getID() == 0) {
				flash.error("ADVERTENCIA: Voce esta logado como Administrador Master.\nSenha nao pode ser redefinida.");
				redefinirSenha();
			}
			else {
				flash.error("Erro. Um evento inesperado ocorreu.\nUsuario logado nao consta na lista de usuarios");
				redefinirSenha();
			}
			r.close();
		}
	}

}